package com.wf.day_0618.test1;

import com.wf.day_0618.test1.entity.Student;
import org.junit.Test;

import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.ArrayList;

/**
 * @author mpk
 * @since 2024/6/18 18:16:15
 */
public class ReflectTest {


   /* 1. 现有集合：ArrayList list = new ArrayList();

2. 利用反射机制在这个泛型为Integer的ArrayList中存放一个String类型的对象。*/
    @Test
    public void test1() throws NoSuchMethodException, InvocationTargetException, IllegalAccessException {

        ArrayList<Integer> list = new ArrayList<>();

        Method add = list.getClass().getMethod("add", Object.class);

        System.out.println(add);
        add.invoke(list, "我是字符串");
        add.invoke(list, "我是字符串");
        add.invoke(list, "我是字符串");
        add.invoke(list, 1);
        add.invoke(list, 2);

        System.out.println(list);


    }
/*    定义一个Student类，用反射去创建一个Student对象，使用两种方式

            1. 通过Class对象的方法创建。

            2. 通过Constructor对象的方法创建。*/

    @Test
    public void test2() throws ClassNotFoundException, NoSuchMethodException, InvocationTargetException, InstantiationException, IllegalAccessException {


//        1. 通过Class对象的方法创建。
        Class<Student> studentClass = Student.class;
        Student student = studentClass.newInstance();
        System.out.println(student);

        //        2. 通过Constructor对象的方法创建
        Class<?> aClass = Class.forName("com.wf.day_0618.test1.entity.Student");

        Constructor<?> constructor = aClass.getConstructor(String.class, Integer.class, String.class, String.class);

        Student instance =(Student) constructor.newInstance("张三", 18, "北京", "123@qq.com");

        System.out.println(instance);


    }
    /*
    1. 定义一个类，在类中定义一个成员方法show，方法功能是：打印一个字符串。

            2. 使用反射机制创建该类的对象，并调用该对象的show方法。*/
    @Test
    public void test3() throws ClassNotFoundException, NoSuchMethodException, InvocationTargetException, InstantiationException, IllegalAccessException {

        Class<Student> aClass = Student.class;

        Student student = aClass.newInstance();

        Method show = aClass.getDeclaredMethod("show");

        show.setAccessible(true);

        show.invoke(student);

    }

    /*1. 编写一个类A，定义一个实例方法	，用于打印一个字符串。
       2. 在编写一个类TestA，用键盘输入一个字符串，该字符串就是类A的全名，使用反射机制创建该类的对象，并  调用该对象中的方法showString*/
    @Test
    public void test4() throws ClassNotFoundException, NoSuchMethodException, InvocationTargetException, InstantiationException, IllegalAccessException {
        //
       // TestA
    }

    /*按要求完成下面两个方法的方法体

    //写一个方法，此方法可将obj对象中名为propertyName的属性的值设置为value.
    public void setProperty(Object obj, String propertyName, Object value){

    }

    //写一个方法，此方法可以获取obj对象中名为propertyName的属性的值
    public Object getProperty(Object obj, String propertyName){

    }*/



}
